#ifdef HAVE_CONFIG_H
  #include "config.h"
#endif

#include "coumo_types.h"
#include "coumo_errorcode.h"

#define type_map_def(n) { ##n##_clear,##n##_hash,##n##_chg,##n##_vtos,##n##_stov,##n##_load,##n##_save}

/*
 *  for
 *      where vt < LN_VT_OBJECT_BEGIN
 */
static int common_clear (LN_THREAD_PTR thrd, LN_VARIANT_PTR v)
{
  v->vt = LN_VT_NONE;
  return 0;
};

/*
 *  for 
 *      LN_VT_NULL
 *      LN_VT_NONE
 *      LN_VT_INT32
 *      LN_VT_UINT32
 *      LN_VT_BOOL
 *      LN_VT_INT64
 *      LN_VT_UINT64
 *      LN_VT_DOUBLE
 *      LN_VT_MONETARY
 */
static int common_chg(LN_THREAD_PTR thrd, LN_VARIANT_PTR v, int ty)
{
  int rc = 0;

  switch (ty)
  {
  case LN_VT_NULL:
  case LN_VT_NONE:
    {
      ln_variant_clear (thrd,v);
    };
    break;

  case LN_VT_INT32:
  case LN_VT_UINT32:
    {
      switch (v->vt)
      {
        case LN_VT_BOOL:
          {
            v->dt.intval = v->dt.boolval ? 1 : 0;
            break;
          };
        case LN_VT_INT32:
        case LN_VT_UINT32:
          {
            break;
          }
        case LN_VT_DOUBLE:
        case LN_VT_MONETARY:
          {
            v->dt.intval = (int)v->dt.realval;
            break;
          };

        case LN_VT_INT64:
        case LN_VT_UINT64:
        case LN_VT_DATE:
        case LN_VT_TIME:
        case LN_VT_DATETIME:
        case LN_VT_TIMESTAMP:
          {
            v->dt.intval = (int)v->dt.i64val;
            break;
          }

        case LN_VT_STRING:
          {
            /* to do */
            break;
          };
        case LN_VT_WSTRING:
          {
            /* to do */
          }break;

        default:
          rc = LN_ER_FAILED;
      };
      break;
    };

  case LN_VT_BOOL :
    {
      switch (v->vt)
      {
      case LN_VT_INT32:
      case LN_VT_UINT32:
        {
          v->dt.boolval = v->dt.intval != 0;
          break;
        };
      case LN_VT_INT64:
      case LN_VT_UINT64:
        {
          v->dt.boolval = v->dt.i64val != 0;
          break;
        }
      case LN_VT_STRING:
        {
            /* to do */
          break;
        };
      case LN_VT_WSTRING:
        {
            /* to do */
          break;
        };
      default:
        rc = LN_ER_FAILED;
      };
      break;
    };
  };
  return 0;
};

/*
 *  for  
 *      where vt < LN_VT_OBJECT_BEGIN
 *      LN_STRING
 *      LN_WSTRING
 */
static int common_hash(LN_VARIANT_PTR v)
{
  return 0;
};

static int common_vtos(LN_THREAD_PTR thrd, LN_VARIANT_PTR v, char * s, int size)
{
    return 0;
};

static int common_stov(LN_THREAD_PTR thrd, LN_VARIANT_PTR v, const char* s, int size)
{
    return 0;
};

static int common_load (LN_THREAD_PTR thrd, LN_VARIANT_PTR v, LN_STREAM_PTR stream)
{
    return 0;
};

static int common_save (LN_THREAD_PTR thrd, LN_VARIANT_PTR v, LN_STREAM_PTR stream)
{
    return 0;
};

static LN_TYPE_MAP _type_NONE = type_map_def(common);
static LN_TYPE_MAP _type_NULL = type_map_def(common);

/*
*/
const LN_TYPE_MAP_PTR _types[] =
{
  &_type_NONE, /* LN_VT_NONE         */
  &_type_NULL, /* LN_VT_NULL         */
  &_type_NONE, /* LN_VT_INT32        */
  &_type_NONE, /* LN_VT_UINT32       */
  &_type_NONE, /* LN_VT_INT64        */
  &_type_NONE, /* LN_VT_UINT64       */

  &_type_NONE, /* LN_VT_DOUBLE       */
  &_type_NONE, /* LN_VT_BOOL         */

  &_type_NONE, /* LN_VT_DATE         */
  &_type_NONE, /* LN_VT_TIME         */
  &_type_NONE, /* LN_VT_DATETIME     */
  &_type_NONE, /* LN_VT_TIMESTAMP    */

  &_type_NONE, /* LN_VT_MONETARY     */

  &_type_NONE, /* LN_VT_BINARY       */
  &_type_NONE, /* LN_VT_STRING       */
  &_type_NONE, /* LN_VT_WSTRING      */
  &_type_NONE, /* LN_VT_BIGINT       */

  &_type_NONE, /* LN_VT_ARRAY_INT    */
  &_type_NONE, /* LN_VT_ARRAY_I64    */
  &_type_NONE, /* LN_VT_ARRAY        */
  &_type_NONE, /* LN_VT_MAP          */

};

